//
// Created by Administrator on 2025/9/19.
//

#ifndef C___LEARN_FRIEND_H
#define C___LEARN_FRIEND_H

#include <string>
#include <iostream>


class B{
public:
    void PrintFriend();
};

//  友元
//  同类对象间无私处(即访问修饰符对同一个类的对象无效)
//  友元的目的本质是，让其他不属于本类的成员(全局函数，其他类的成员函数)，成为类的成员而具备了本类成员的属性。
class Friend {
    //  友元函数
    //  需要在类的定义中加以声明。
    //  一个函数可以是多个类的友元函数，只需要在各个类中分别声明。
    friend void Func1();
    friend void B::PrintFriend();
private:
    int age;
    std::string name;

    //  友元类
    //  友元类的所有成员函数都是另一个类的友元函数，都可以访问另一个类中的隐藏信息(包括私有成员和保护成员).
    friend class A;

    //  友元总结
    //  友元不是授权类的成员，所以不受其所在类声明区域的修饰符影响。一般放在类开头之后。
    //  友元的作用是提高程序的运行效率。(弥补在某些场合下访问修饰符的呆板)
    //  PS
    //  友元关系不能被继承
    //  友元关系是单向的，不具有交换性。
    //  友元关系不具有传递性。
};

class A{
public:
    void PrintFriend(){
        Friend aFriend;
        //  直接访问私有成员
        std::cout << aFriend.age << aFriend.name << std::endl;
    }
};


#endif //C___LEARN_FRIEND_H
